package cn.csq.rpc.server;

import cn.csq.rpc.Request;
import cn.csq.rpc.ServiceDescriptor;
import com.csq.rpc.common.utils.ReflectionUtils;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Method;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author csq
 * @version 1.0.0
 * @ClassName ServiceManager.java
 * @Description 管理rpc暴露的服务
 * @createTime 2021年12月20日 00:21:00
 */
@Slf4j
public class ServiceManager {

    //注册服务

    //查找服务

    /**
     * 服务描述信息  服务具体实现
     */
    private Map<ServiceDescriptor, ServiceInstance> services;

    public ServiceManager() {
        //初始化
        this.services = new ConcurrentHashMap<>();
    }

    /**
     * 注册
     * 将interfaceClass中所有的method当成服务注册进service中
     * @param interfaceClass 接口的一个class
     * @param bean           接口具体实现的一个子类对象
     */
    public <T> void register(Class<T> interfaceClass, Object bean) {
        Method[] methods = ReflectionUtils.getPublicMethods(interfaceClass);
        for (Method method : methods) {
            ServiceInstance serviceInstance = new ServiceInstance(bean, method);
            ServiceDescriptor serviceDescriptor = ServiceDescriptor.from(interfaceClass, method);
            //描述信息 服务实例
            services.put(serviceDescriptor, serviceInstance);
            log.info("register service:{}---{}", serviceDescriptor.getClazz(), serviceDescriptor.getMethod());
        }
    }

    /**
     * 查找根据请求查找具体实现类
     * @param request
     * @return
     */
    public ServiceInstance lookup(Request request) {
        ServiceDescriptor service = request.getService();
        //get这里是使用的自定义的ServiceDescriptor信息来去判断key的，map去判断是使用equals方法的。
        //所以需要实现ServiceDescriptor的equals方法
        return services.get(service);
    }

}
